package cn.my.service.common;

import java.util.Calendar;

import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import com.alibaba.fastjson.JSONObject;

import cn.my.common.bean.BaseResponse;
import cn.my.common.bean.PaginationBean;
import cn.my.common.constant.DefaultURI;
import cn.my.common.constant.ResultCodeJson;
import cn.my.common.date.DateUtil;
import cn.my.common.enums.AuditEnum;
import cn.my.common.enums.StateEnum;
import cn.my.common.http.QywxHttpClient;
import cn.my.common.http.ServiceClient;
import cn.my.common.response.ListResponse;
import cn.my.model.common.AuditFlow;
import cn.my.model.user.Employee;

/**
 * @author clark
 * 审核电子流类业务
 */
@Service
public class AuditFlowService
{
    
    /** 
     * 新增电子流 - 默认步骤：部门<br>
     * 适用于年度述职
     * @param flow 电子流对象
     * @return BaseResponse
     * @see [类、类#方法、类#成员]
     */
    public BaseResponse addAuditFlow(AuditFlow flow)
    {
        // 待处理
        flow.setHandleFlag(1);
        // 提交时间
        flow.setBeginTime(
            DateUtil.formatDateToString(DateUtil.DATE_FORMAT_SECOND_BAR, Calendar.getInstance().getTime()));
        
        BaseResponse reuslt =
            ServiceClient.call(flow, DefaultURI.getAuditFlowURIKey(DefaultURI.URI_ADD), BaseResponse.class);
        return reuslt;
        
    }
    
    /** 
     * 新增电子流 - 默认步骤：部门<br>
     * 适用于年度述职
     * @param auditId 业务ID
     * @param auditType 审核类型  1-年度述职 2-员工转正
     * @param auditStaffId 审核人编号
     * @param auditStaffName 审核人名称
     * @param staffInfo 当前登录员工信息
     * @return BaseResponse
     * @see [类、类#方法、类#成员]
     */
    public BaseResponse addAuditFlow(Integer auditId, Integer auditType, String auditStaffId, String auditStaffName,
        Employee staffInfo)
    {
        AuditFlow flow = new AuditFlow();
        // 审核人信息
        flow.setStaffId(auditStaffId);
        flow.setStaffName(auditStaffName);
        
        // 提交人信息
        flow.setSubmitStaffId(staffInfo.getEmployeeId());
        flow.setSubmitStaffName(staffInfo.getName());
        
        // 业务ID
        flow.setAuditId(auditId);
        
        // 待处理
        flow.setHandleFlag(1);
        
        // 审核类型-转正申请
        flow.setAuditType(auditType);
        // 审核步骤 1-部门 2-人事 3-总经理
        flow.setAuditStep(AuditEnum.AUDIT_STEP_DEPT_1.getId());
        
        flow.setBeginTime(
            DateUtil.formatDateToString(DateUtil.DATE_FORMAT_SECOND_BAR, Calendar.getInstance().getTime()));
        
        BaseResponse reuslt =
            ServiceClient.call(flow, DefaultURI.getAuditFlowURIKey(DefaultURI.URI_ADD), BaseResponse.class);
        return reuslt;
    }
    
    /**
     * 查询
     * @param sessionStaff 当前登录的用户
     * @param param 参数
     * @return JSONObject
     */
    public JSONObject query(Employee sessionStaff, AuditFlow param)
    {
        // 设置当前用户id
        param.setStaffId(sessionStaff.getEmployeeId().toString());
        
        // 设置分页
        param.setPage(PaginationBean.getPagination(param.getPage()));
        
        String reuslt = ServiceClient.call(param, DefaultURI.getAuditFlowURIKey(DefaultURI.URI_QUERY));
        return JSONObject.parseObject(reuslt);
    }
    
    /**
     * 查询-不分页
     * @param param 参数
     * @return JSONObject
     */
    public JSONObject query(AuditFlow param)
    {
        String reuslt = ServiceClient.call(param, DefaultURI.getAuditFlowURIKey(DefaultURI.URI_QUERY));
        return JSONObject.parseObject(reuslt);
    }
    
    /**
     * 查询数量
     * @param param 参数
     * @return JSONObject
     */
    public JSONObject queryTotal(AuditFlow param)
    {
        String reuslt = ServiceClient.call(param, DefaultURI.getAuditFlowURIKey(DefaultURI.URI_QUERY_TOTAL));
        return JSONObject.parseObject(reuslt);
    }
    
    /**
     * 审核处理，转正、述职
     * @param sessionStaff 当前登录的用户
     * @param param 参数
     * @return JSONObject
     */
    public BaseResponse auditHandler(Employee sessionStaff, AuditFlow param)
    {
        BaseResponse response = new BaseResponse();
        
        param.setHandleFlag(AuditEnum.AUDIT_HANDLE_OK.getId());
        param.setFinishTime(
            DateUtil.formatDateToString(DateUtil.DATE_FORMAT_SECOND_BAR, Calendar.getInstance().getTime()));
        
        // 根据flowId查询当前电子流信息，已处理的电子流无法再次处理
        AuditFlow queryParam = new AuditFlow();
        queryParam.setFlowId(param.getFlowId());
        ListResponse<AuditFlow> flowList = ServiceClient.callList(queryParam,
            DefaultURI.getAuditFlowURIKey(DefaultURI.URI_QUERY),
            AuditFlow.getTypeReference());
        if (flowList.isSuccess() && !CollectionUtils.isEmpty(flowList.getResult()))
        {
            AuditFlow queryFlow = flowList.getResult().get(0);
            if (queryFlow.getHandleFlag().intValue() == AuditEnum.AUDIT_HANDLE_OK.getId())
            {
                // 已处理的电子流无法再次处理
                return ResultCodeJson.getBr3();
            }
        }
        
        // 更新审核结果
        BaseResponse updateResponse =
            ServiceClient.call(param, DefaultURI.getAuditFlowURIKey(DefaultURI.URI_UPDATE), BaseResponse.class);
        if (!updateResponse.isSuccess())
        {
            // 更新失败直接返回
            return updateResponse;
        }
        
        // 驳回直接返回
        if (param.getState().intValue() == StateEnum.FLOW_STATE_REJECT_2.getId())
        {
            return response;
        }
        
        // 更新成功继续
        if (param.getAuditType().intValue() == AuditEnum.SZ_TYPE_1.getId())
        {
            // 述职
            // 判断当前审核人是否还有上一级
            if (!StringUtils.isEmpty(sessionStaff.getSupervisor()))
            {
                // 给下一个审核人记录电子流
                response = this.addAuditFlow(param.getAuditId(),
                    param.getAuditType(),
                    sessionStaff.getSupervisor(),
                    sessionStaff.getSupervisorName(),
                    sessionStaff);
                
                if (response.isSuccess())
                {
                    // 发送企业微信消息
                    QywxHttpClient.sendMsg(sessionStaff.getSupervisor(), "您有一则年度述职需要审批");
                }
            }
        }
        else
        {
            // 转正
            if (param.getAuditStep().intValue() == AuditEnum.AUDIT_STEP_DEPT_1.getId())
            {
                // 部门评定，给下一个审核人记录电子流，此审核人是从界面选择而来
                AuditFlow flow = new AuditFlow();
                // 审核人信息
                flow.setStaffId(param.getStaffId());
                flow.setStaffName(param.getStaffName());
                // 提交人信息
                flow.setSubmitStaffId(sessionStaff.getEmployeeId());
                flow.setSubmitStaffName(sessionStaff.getName());
                // 业务ID
                flow.setAuditId(param.getAuditId());
                // 审核类型-转正申请
                flow.setAuditType(param.getAuditType());
                // 审核步骤 1-部门 2-人事 3-总经理
                flow.setAuditStep(AuditEnum.AUDIT_STEP_HR_2.getId());
                response = this.addAuditFlow(flow);
                
                if (response.isSuccess())
                {
                    // 发送企业微信消息
                    QywxHttpClient.sendMsg(param.getStaffId(), "您有一则转正申请需要审批");
                }
            }
        }
        
        return response;
    }
}
